#include <TM1638plus.h>
//Origineel door Gavin Lyons
//Aangepast door EduTechSoft.nl
//Datum 12 september 2026
//Voor TM1638 op universele printplaat
#define STROBE_TM 4
#define CLOCK_TM 3
#define DIO_TM 2
//Voor Badge
//#define STROBE_TM 2
//#define CLOCK_TM 3
//#define DIO_TM 4
bool high_freq = false; //default false,, If using a high freq CPU > ~100 MHZ set to true.
//Constructor object (GPIO STB , GPIO CLOCK , GPIO DIO, use high freq MCU)
TM1638plus tm(STROBE_TM, CLOCK_TM , DIO_TM, high_freq);
char *myStrings[] = {"The Question is... To PIE Or Not To BE ", "Arduino Nano met TM1638 key module ", "Theorie zonder prakijk is lam , Praktijk zonder theorie is blind ",
"Een goede leraar is het halve huiswerk ", "Een ELO waar muziek in zit - Eldorado ", "Licht ", "Down ", " UP "};
int Helderheid = 2, HelderheidOud = 2;
int Welketekst = 0;
int Knoppen = 0, Knoppenold = 0;
int ScrollSnelheid = 500;
String Samenvoegen;
void setup(){
//Serial.begin(9600); // Voor debuggen
tm.displayBegin();
delay(50);
}
void loop(){
Lichtkrant(); //Voor het scrollen van de teksten
}
void Lichtkrant(){
unsigned long previousMillis_display = 0; //Voor het opslaan van de laatst gebruikte tijd
//De tekst van de array in een te bewerken char plaatsen, anders wordt de tekst gewist tijdens het scrollen gewist
String BewaarTekst = " "; // Aanloop van rechts beginnen
BewaarTekst += myStrings[Welketekst];
char charArray[BewaarTekst.length() + 1];
BewaarTekst.toCharArray(charArray, sizeof(charArray));
while(1){
tm.displayText(charArray);
unsigned long currentMillis = millis();
Knoppen = tm.readButtons();
if (Knoppenold!=Knoppen){
LeesKnoppen();
return;
}
yield(); // Added to prevent ESP8266 crash.
if (currentMillis - previousMillis_display >= ScrollSnelheid){
previousMillis_display = currentMillis;
if (strlen(charArray) > 0){
memmove(charArray, charArray+1, strlen(charArray));
tm.displayText(" "); //Clear display or last character will drag across screen
}else{
return;
}
}
}
}
void LeesKnoppen(){
tm.displayText(" ");
delay(25);
Knoppen = tm.readButtons();
if (Knoppenold!=Knoppen){
doLEDs(Knoppen);
Knoppenold = Knoppen;
switch (Knoppen) {
case 1:
tm.displayText(myStrings[0]);
Welketekst = 0;
break;
case 2:
tm.displayText(myStrings[1]);
Welketekst = 1;
break;
case 4:
tm.displayText(myStrings[2]);
Welketekst = 2;
break;
case 8:
tm.displayText(myStrings[3]);
Welketekst = 3;
break;
case 16:
tm.displayText(myStrings[4]);
Welketekst = 4;
break;
case 32:
tm.displayText(myStrings[5]);
//Helderheid
Helderheid++;
if (Helderheid > 3){
Helderheid = 0;
}
if (HelderheidOud != Helderheid){
Samenvoegen = String(myStrings[5]) + (Helderheid);
char CharSamenvoegen[Samenvoegen.length() + 1];
Samenvoegen.toCharArray(CharSamenvoegen, sizeof(CharSamenvoegen));
tm.displayText(CharSamenvoegen);
tm.brightness(Helderheid);
HelderheidOud = Helderheid;
}
break;
case 64:
tm.displayText(myStrings[6]);
if(ScrollSnelheid < 1000){
ScrollSnelheid = ScrollSnelheid + 50;
Samenvoegen = String(myStrings[6]) + (ScrollSnelheid);
char CharSamenvoegen[Samenvoegen.length() + 1];
Samenvoegen.toCharArray(CharSamenvoegen, sizeof(CharSamenvoegen));
tm.displayText(CharSamenvoegen);
}
break;
case 128:
if(ScrollSnelheid >= 50){
ScrollSnelheid = ScrollSnelheid - 50;
Samenvoegen = String(myStrings[7]) + (ScrollSnelheid);
char CharSamenvoegen[Samenvoegen.length() + 1];
Samenvoegen.toCharArray(CharSamenvoegen, sizeof(CharSamenvoegen));
tm.displayText(CharSamenvoegen);
}
break;
default:
// if nothing else matches, do the default
// default is optional
break;
}
while (Knoppen == Knoppenold){
Knoppen = tm.readButtons();
delay(10);
}
Knoppenold = 0;
doLEDs(0);
}
}
void doLEDs(uint8_t value){
//Laat van de bediende knoppen de bijbehorende led's branden
for (uint8_t LEDposition = 0; LEDposition < 8; LEDposition++) {
tm.setLED(LEDposition, value & 1);
value = value >> 1;
}
}